package org.aplombh.java.awcing.basic.struct.disjointSetUnion;

import java.util.Scanner;

/**
 * 给定一个包含 n 个点（编号为 1∼n）的无向图，初始时图中没有边。
 *
 * 现在要进行 m 个操作，操作共有三种：
 *
 * C a b，在点 a 和点 b 之间连一条边，a 和 b 可能相等；
 * Q1 a b，询问点 a 和点 b 是否在同一个连通块中，a 和 b 可能相等；
 * Q2 a，询问点 a 所在连通块中点的数量；
 * 输入格式
 * 第一行输入整数 n 和 m。
 *
 * 接下来 m 行，每行包含一个操作指令，指令为 C a b，Q1 a b 或 Q2 a 中的一种。
 *
 * 输出格式
 * 对于每个询问指令 Q1 a b，如果 a 和 b 在同一个连通块中，则输出 Yes，否则输出 No。
 *
 * 对于每个询问指令 Q2 a，输出一个整数表示点 a 所在连通块中点的数量
 *
 * 每个结果占一行。
 *
 * 数据范围
 * 1≤n,m≤105
 * 输入样例：
 * 5 5
 * C 1 2
 * Q1 1 2
 * Q2 1
 * C 2 5
 * Q2 5
 * 输出样例：
 * Yes
 * 2
 * 3
 */
public class ConnectedBlock_837 {

    private static final int N = 100010;
    public static int[] p = new int[N];
    public static int[] s = new int[N];

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        for (int i = 0; i < n; i++) {
            p[i] = i;
            s[i] = 1;
        }

        while (m-- != 0) {
            String op = scanner.next();


            if(op.charAt(0) == 'C')
            {
                int a = scanner.nextInt();
                int b = scanner.nextInt();

                if(find(a) == find(b)) continue;
                // 将 a 加入到 b 所在集合, 将 b 集合内的点的数目增加1
                // Add a to the set of b, increase the number of points in b by 1
                s[find(b)] += s[find(a)];
                p[find(a)] = find(b);
            }
            else if(op.charAt(1) == '1')
            {
                int a = scanner.nextInt();
                int b = scanner.nextInt();

                if(find(a) == find(b)) System.out.println("Yes");
                else System.out.println("No");
            }
            else
            {
                int a = scanner.nextInt();

                System.out.println(s[find(a)]);
            }
        }
    }

    static int find(int x) {
        // 如果 p[x] != x 说明有它与别人共同属于同一个集合, 递归寻找 p[x] = x 的记录
        // if p[x]! = x indicates that it and others belong to the same set, recursively looking for p[x] = x records
        if (p[x] != x) p[x] = find(p[x]);
        return p[x];
    }
}
